/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelos;

import java.sql.*;
import java.io.*;
import java.text.DateFormat;
import java.util.*;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author diegoarmandocontrerashernandez
 */
public class Articulo {

    private Connection conn;
    private Statement stmt;
    
    private int idArticulo;
    private String fechaCreacion;
    private String titulo;
    private LinkedList<Autor> autores;
    private Resumen resumen;
    private int extension;
    private String contenido;
    
    public Articulo() {
        try {
            String userName = "root";
            String password = "";
            String url = "jdbc:mysql://localhost:3306/seng";;
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(url, userName, password);
            stmt = conn.createStatement();
        } catch (Exception e) {
            System.out.println("Cannot connect to database server");
        }
    }
    
    public void agregaRevista(String idArticulo, String idRevista) {
        try {
            String query = "INSERT INTO Revista_Articulo (id_revista, id_articulo) VALUES ("+ idRevista + ", " + idArticulo + ")";
            stmt.executeUpdate(query);
        } catch (Exception e) {
            System.out.println("Cannot update database" + e);
        }
    }

    public int agregar() {
        try {
            String s = "INSERT INTO ARTICULO (extension, titulo, contenido)"
                    + " VALUES (" + extension + "', '" + titulo + "','"+contenido+"')";
            System.out.println(s);
            //stmt.executeUpdate(s, );
            int numero=stmt.executeUpdate(s, Statement.RETURN_GENERATED_KEYS);       
            return numero;
        } catch (Exception e) {
            System.out.println("Cannot update database" + e);
            return -1;
        }
    }
    
    public LinkedList getTitulos(){
        LinkedList titulos;
        titulos = new LinkedList();
        
      try {
         stmt.executeQuery ("SELECT a.titulo, a.id_articulo FROM articulo a WHERE a.id_articulo NOT IN (SELECT id_articulo FROM revista_articulo RA)");
         ResultSet rs = stmt.getResultSet();
        // rs.next(); //Va al registro ya validado
         while(rs.next()){
            titulos.add(rs.getString("titulo"));
            titulos.add(rs.getString("id_articulo"));
         }
         rs.close();
         return(titulos);
      } catch (SQLException e) {System.out.println ("Cannot getNombres()" + e);}
      return titulos;
   }

    public LinkedList<Articulo> getArticulos() {
        LinkedList<Articulo> articulos = new LinkedList<Articulo>();

        try {
            stmt.executeQuery("SELECT A.id_articulo, A.fecha_creacion, A.titulo, R.id_resumen, R.contenido, AA.id_autor FROM Articulo A, Resumen R, Autor_Articulo AA " +
                              "WHERE A.id_articulo = R.id_articulo AND A.id_articulo = AA.id_articulo");
            ResultSet rs = stmt.getResultSet();
            Articulo articulo = null;
            Resumen resumen = null;
            Autor autor = null;
            int ultimoId = -1;
            while (rs.next()) {
                if(ultimoId != rs.getInt("id_articulo")){
                    ultimoId = rs.getInt("id_articulo");
                    resumen = new Resumen();
                    articulo = new Articulo();
                    //Datos del articulo
                    articulo.setIdArticulo(rs.getInt("id_articulo"));
                    articulo.setFechaCreacion(DateFormat.getInstance().format(rs.getTimestamp("fecha_creacion")));
                    articulo.setTitulo(rs.getString("titulo"));
                    //Datos del resumen
                    resumen.setIdResumen(rs.getInt("id_resumen"));
                    resumen.setContenidoResumen(rs.getString("contenido"));
                    //Agrega el resumen al articulo
                    articulo.setResumen(resumen);
                    //Agrega el primer autor al articulo
                    autor = new Autor();
                    autor.setIdAutor(rs.getInt("id_autor"));
                    articulo.agregarAutor(autor);
                    //Agrega el articulo a la lista de articulos
                    articulos.add(articulo);
                }
                else {
                    autor = new Autor();
                    autor.setIdAutor(rs.getInt("id_autor"));
                    articulo.agregarAutor(autor);
                }    
            }
            rs.close();
            return (articulos);
        } catch (SQLException e) {
            System.out.println("Cannot getArticulos() " + e);
        }
        return articulos;
    }
    
    public LinkedList<Articulo> getArticulosPorNombreOFecha(String busqueda, String fecha) {
        
        LinkedList<Articulo> articulos = new LinkedList<Articulo>();

        try {
            if(!busqueda.equals("null") || !fecha.equals("null")){
                if(!busqueda.equals("null") && fecha.equals("null")){
                    stmt.executeQuery("SELECT A.id_articulo, A.fecha_creacion, A.titulo, R.id_resumen, R.contenido, AA.id_autor FROM Articulo A, Resumen R, Autor_Articulo AA " +
                                    "WHERE A.id_articulo = R.id_articulo AND A.id_articulo = AA.id_articulo AND (R.contenido LIKE '%"+busqueda+"%' OR A.titulo LIKE '%"+busqueda+"%')");
                }
                else if(busqueda.equals("null") && !fecha.equals("null")){
                    stmt.executeQuery("SELECT A.id_articulo, A.fecha_creacion, A.titulo, R.id_resumen, R.contenido, AA.id_autor FROM Articulo A, Resumen R, Autor_Articulo AA " +
                                    "WHERE A.id_articulo = R.id_articulo AND A.id_articulo = AA.id_articulo AND A.fecha_creacion >= '"+fecha+"'");
                }
                else{
                    stmt.executeQuery("SELECT A.id_articulo, A.fecha_creacion, A.titulo, R.id_resumen, R.contenido, AA.id_autor FROM Articulo A, Resumen R, Autor_Articulo AA " +
                                    "WHERE A.id_articulo = R.id_articulo AND A.id_articulo = AA.id_articulo AND A.fecha_creacion >= '"+fecha+"' AND (R.contenido LIKE '%"+busqueda+"%' OR A.titulo LIKE '%"+busqueda+"%')");
                }
                ResultSet rs = stmt.getResultSet();
                Articulo articulo = null;
                Resumen resumen = null;
                Autor autor = null;
                int ultimoId = -1;
                while (rs.next()) {
                    if(ultimoId != rs.getInt("id_articulo")){
                        ultimoId = rs.getInt("id_articulo");
                        resumen = new Resumen();
                        articulo = new Articulo();
                        //Datos del articulo
                        articulo.setIdArticulo(rs.getInt("id_articulo"));
                        articulo.setFechaCreacion(DateFormat.getInstance().format(rs.getTimestamp("fecha_creacion")));
                        articulo.setTitulo(rs.getString("titulo"));
                        //Datos del resumen
                        resumen.setIdResumen(rs.getInt("id_resumen"));
                        resumen.setContenidoResumen(rs.getString("contenido"));
                        //Agrega el resumen al articulo
                        articulo.setResumen(resumen);
                        //Agrega el primer autor al articulo
                        autor = new Autor();
                        autor.setIdAutor(rs.getInt("id_autor"));
                        articulo.agregarAutor(autor);
                        //Agrega el articulo a la lista de articulos
                        articulos.add(articulo);
                    }
                    else {
                        autor = new Autor();
                        autor.setIdAutor(rs.getInt("id_autor"));
                        articulo.agregarAutor(autor);
                    }    
                }
                rs.close();
            }
            return (articulos);
        } catch (SQLException e) {
            System.out.println("Cannot getArticulosPorNombreOFecha() " + e);
        }
        return articulos;
    }
    
    public LinkedList<Articulo> getArticulosDeRevista(int idRevista) throws SQLException {
        LinkedList<Articulo> articulos = new LinkedList<Articulo>();
        try {
            if(idRevista > 0){
                stmt.executeQuery("SELECT A.id_articulo, A.fecha_creacion, A.titulo, R.id_resumen, R.contenido, AA.id_autor FROM Articulo A, Resumen R, Autor_Articulo AA, Revista_Articulo RA " +
                                  "WHERE A.id_articulo = R.id_articulo AND A.id_articulo = AA.id_articulo AND RA.id_articulo = A.id_articulo AND RA.id_revista = " + idRevista);
                
                ResultSet rs = stmt.getResultSet();
                Articulo articulo = null;
                Resumen resumen = null;
                Autor autor = null;
                int ultimoId = -1;
                while (rs.next()) {
                    if(ultimoId != rs.getInt("id_articulo")){
                        ultimoId = rs.getInt("id_articulo");
                        resumen = new Resumen();
                        articulo = new Articulo();
                        //Datos del articulo
                        articulo.setIdArticulo(rs.getInt("id_articulo"));
                        articulo.setFechaCreacion(DateFormat.getInstance().format(rs.getTimestamp("fecha_creacion")));
                        articulo.setTitulo(rs.getString("titulo"));
                        //Datos del resumen
                        resumen.setIdResumen(rs.getInt("id_resumen"));
                        resumen.setContenidoResumen(rs.getString("contenido"));
                        //Agrega el resumen al articulo
                        articulo.setResumen(resumen);
                        //Agrega el primer autor al articulo
                        autor = new Autor();
                        autor.setIdAutor(rs.getInt("id_autor"));
                        articulo.agregarAutor(autor);
                        //Agrega el articulo a la lista de articulos
                        articulos.add(articulo);
                    }
                    else {
                        autor = new Autor();
                        autor.setIdAutor(rs.getInt("id_autor"));
                        articulo.agregarAutor(autor);
                    }    
                }
                rs.close();
            }
            return (articulos);
        } catch (Exception e) {
            System.out.println("Cannot getArticulosPorNombreOFecha() " + e);
        }
        return articulos;
    }
    
    public int getIdArticulo(){
        return idArticulo;
    }
    
    public void setIdArticulo(int idArticulo){
        this.idArticulo = idArticulo;
    }
    
    public String getFechaCreacion(){
        return fechaCreacion;
    }
    
    public void setFechaCreacion(String fechaCreacion){
        this.fechaCreacion = fechaCreacion;
    }
    
    public String getTitulo(){
        return titulo;
    }
    
    public void setTitulo(String titulo){
        this.titulo = titulo;
    }
    
    public LinkedList<Autor> getAutores(){
        return autores;
    }
    
    public void setAutores(LinkedList<Autor> autores){
        this.autores = autores;
    }
    
    public void agregarAutor(Autor autor){       
        if(autores == null){
            autores = new LinkedList<Autor>();
        }
        autores.add(autor);
    }
    
    public Resumen getResumen() {
        return resumen;
    }

    public void setResumen(Resumen resumen) {
        this.resumen = resumen;
    }
    
    public int getExtension(){
        return extension;
    }
    public void setExtension(int extension){
        this.extension = extension;
    }
    public String getContenido(){
        return contenido;
    }   
    public void setContenido(String contenido){
        this.contenido = contenido;
    }
 
}
